home *** CD-ROM | disk | FTP | other *** search
- unit Change2u;
-
- interface
-
- uses
- ThunkU, SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
- Forms, Dialogs, StdCtrls, Grids, DBGrids, DB, DBTables;
-
- const
- wm_TableChanged = wm_User + 57;
-
- type
- TForm1 = class(TForm)
- Table1: TTable;
- DataSource1: TDataSource;
- DBGrid1: TDBGrid;
- procedure FormDestroy(Sender: TObject);
- procedure FormCreate(Sender: TObject);
- private
- { Private declarations }
- FOldCallBack: TCallBack;
- FChangeFunctionThunk: TFarProc;
- public
- { Public declarations }
- procedure WMTableChanged(var Msg: TMessage); message wm_TableChanged;
- end;
-
- var
- Form1: TForm1;
-
- implementation
-
- uses
- DbiTypes, DbiProcs;
-
- {$R *.DFM}
- {$S-}
-
- function ChangeFunction(ecbType: CBType; iClientData: Longint;
- var CbInfo: Pointer): CBRType; export;
- begin
- Result := cbrUseDef;
- { Refresh table, but not while this callback is executing - in a }
- { message handler that runs after this has done }
- if ecbType = cbTableChanged then
- PostMessage(Application.MainForm.Handle, wm_TableChanged, 0, iClientData);
- { Chain on to old callback, if any }
- with Form1.FOldCallBack do
- if ChainedFunc <> nil then Result :=
- pfDBICallBack(ChainedFunc)(cbTableChanged, Data, Buffer)
- end;
-
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- FChangeFunctionThunk := NewMakeProcInstance(@ChangeFunction, HInstance);
- { Find any current callback }
- with FOldCallBack do
- DbiGetCallBack(nil, cbTableChanged, Data, BufLen, Buffer, @ChainedFunc);
- { Register our callback }
- DbiRegisterCallBack(Table1.Handle, cbTableChanged, Longint(Table1), 0, nil,
- pfDbiCallBack(FChangeFunctionThunk));
- end;
-
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- DbiRegisterCallBack(Table1.Handle, cbTableChanged, 0, 0, nil, nil);
- NewFreeProcInstance(FChangeFunctionThunk);
- end;
-
- procedure TForm1.WMTableChanged(var Msg: TMessage);
- begin
- if MessageDlg(TTable(Msg.LParam).TableName + ' has changed - refresh?',
- mtConfirmation, [mbYes, mbNo], 0) = mrYes then
- TTable(Msg.LParam).Refresh;
- end;
-
- end.
-